home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 425_01 / lzpipe / dzmain.c < prev    next >
Text File  |  1994-02-24  |  4KB  |  146 lines

  1. #include <stdio.h>
  2. #include "modern.h"
  3. #ifdef MODERN
  4. #    include <stdlib.h>
  5. #else
  6.     void exit();
  7. #endif
  8. #ifdef __TURBOC__
  9. #    include <io.h>
  10. #endif
  11. #include "lzpipe.h"
  12.  
  13. FILE *inp, *out;
  14.  
  15. #ifdef LZFILE
  16. #    define INP_PORT inp
  17. #    define OUT_PORT out
  18. #else
  19. #    define INP_PORT getchr
  20. #    define OUT_PORT putchr
  21.  
  22. int getchr(void)
  23. {
  24.    register c = getc(inp);
  25.    if (ferror(inp)) {
  26.       perror("Read error"); exit(-1);
  27.    }
  28.    return c;
  29. }
  30.  
  31. int putchr(int c)
  32. {
  33.    (void)putc(c, out);
  34.    if (ferror(out)) {
  35.       perror("Write error"); exit(-1);
  36.    }
  37.    return 0;
  38. }
  39. #endif
  40.  
  41. main(argc, argv)
  42. int argc; char *argv[];
  43. {
  44.    char buf[1024];
  45.    register i;
  46.    register char *p;
  47.    char todo = '\0';
  48.    int level = 6;
  49.    int ztype = ZIP_ANY;
  50.  
  51.    if (argc < 2) {
  52.       (void)fprintf(stderr,
  53.          "Usage: dogzip -c|d [-1-9] [-p|g] infile outfile\n");
  54.       return -1;
  55.    }
  56.    for (i=1; i<argc && *(p = argv[i]) == '-'; i++) {
  57.       ++p;
  58.       switch (*p<'A' || *p>'Z' ? *p : *p+('z'-'Z')) {
  59.          case '1': case '2': case '3':
  60.          case '4': case '5': case '6':
  61.          case '7': case '8': case '9':
  62.             level = *p - '0';
  63.             break;
  64.          case 'c':
  65.             if (todo) goto ambiguous;
  66.             todo = 'c';
  67.             break;
  68.          case 'd':
  69.             if (todo) goto ambiguous;
  70.             todo = 'd';
  71.             break;
  72.          case 'g':
  73.             if (ztype != ZIP_ANY) goto ambiguous;
  74.             ztype = ZIP_GNU;
  75.             break;
  76.          case 'p':
  77.             if (ztype != ZIP_ANY) goto ambiguous;
  78.             ztype = ZIP_PKW;
  79.             break;
  80.          default :
  81.             (void)fprintf(stderr, "Invalid option \'%c\'\n", *p);
  82.             return -1;
  83.       }
  84.    }
  85.    if (ztype == ZIP_ANY) ztype = ZIP_GNU;
  86.    if (!todo) {
  87.       (void)fprintf(stderr, "Either \'c\' or \'d\' must be specified\n");
  88.       return -1;
  89.    }
  90.    if (i+1 >= argc) {
  91.       (void)fprintf(stderr,
  92.          "No %sput file specified\n", i<argc ? "out" : "in");
  93.       return -1;
  94.    }
  95.    if ((inp = fopen(p=argv[ i ], "rb")) == NULL ||
  96.        (out = fopen(p=argv[i+1], "wb")) == NULL) {
  97.       perror(p); return -1;
  98.    }
  99.    if (todo != 'd') {
  100.       if (zipcreat(OUT_PORT, ztype, level)) {
  101.          (void)fprintf(stderr, "Zip error: %s\n", lzerrlist[lzerror]);
  102.          return -1;
  103.       }
  104.       do {
  105.          if ((i = read(fileno(inp), buf, sizeof(buf))) == -1) {
  106.             perror("Read error");
  107.             return -1;
  108.          }
  109.          if (i > 0 && zipwrite(buf, i) != i) {
  110.             (void)fprintf(stderr, "Zip error: %s\n", lzerrlist[lzerror]);
  111.             return -1;
  112.          }
  113.       } while (i == sizeof(buf));
  114.       i = 0;
  115.       if (zipclose() == -1L) {
  116.          (void)fprintf(stderr, "Zip error: %s\n", lzerrlist[lzerror]);
  117.          i = -1;
  118.       }
  119.       if (fclose(out) != 0) {
  120.          perror("Close error"); i = -1;
  121.       }
  122.    } else {
  123.       if (unzopen(INP_PORT, ZIP_ANY)) {
  124.          (void)fprintf(stderr, "Unzip error: %s\n", lzerrlist[lzerror]);
  125.          return -1;
  126.       }
  127.       do {
  128.          if ((i = unzread(buf, sizeof(buf))) == -1) {
  129.             (void)fprintf(stderr, "Unzip error: %s\n", lzerrlist[lzerror]);
  130.             return -1;
  131.          }
  132.          if (i > 0 && write(fileno(out), buf, i) != i) {
  133.             perror("Write error"); return -1;
  134.          }
  135.       } while (i == sizeof(buf));
  136.       if ((i = unzclose()) != 0) {
  137.          (void)fprintf(stderr, "Unzip %s: %s\n",
  138.             i == -1 ? "error" : "warning", lzerrlist[lzerror]);
  139.       }
  140.    }
  141.    return i;
  142. ambiguous:
  143.    (void)fprintf(stderr, "Ambiguous options\n");
  144.    return -1;
  145. }
  146.